package DefineAnnotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

/*
* 定义注解
* */
public class DefineAnnotation {
    public static void main(String[] args) {

    }

    //1:java语言使用@interface语法来定义注解
    //注解的参数类似无参数方法，可以用default设定一个默认值（强烈推荐）。最常用的参数应当命名为value。
    public @interface Report {
        int type() default 0;
        String lavel() default "info";
        String value() default "";
    }

    //2:元注解
    //有一些注解可以修饰其他注解，这些注解就称为元注解（meta annotation）。Java标准库已经定义了一些元注解，我们只需要使用元注解，通常不需要自己去编写元注解。
    /*
    * 最常用的元注解是@Target。使用@Target可以定义Annotation能够被应用于源码的哪些位置：

    类或接口：ElementType.TYPE；
    字段：ElementType.FIELD；
    方法：ElementType.METHOD；
    构造方法：ElementType.CONSTRUCTOR；
    方法参数：ElementType.PARAMETER。
    * */
    //例如，定义注解@Report可用在方法上，我们必须添加一个@Target(ElementType.METHOD)：
    @Target(ElementType.METHOD)
    public @interface Report1 {
        int type() default 0;
        String level() default "info";
        String value() default "";
    }

    //Retention
    /*
    * 另一个重要的元注解@Retention定义了Annotation的生命周期：

    仅编译期：RetentionPolicy.SOURCE；
    仅class文件：RetentionPolicy.CLASS；
    运行期：RetentionPolicy.RUNTIME。
    如果@Retention不存在，则该Annotation默认为CLASS。因为通常我们自定义的Annotation都是RUNTIME，所以，务必要加上@Retention(RetentionPolicy.RUNTIME)这个元注解：
    * */
//    @Retention(RetentionPolicy.RUNTIME)
//    public @interface Report2 {
//        int type() default 0;
//        String level() default "info";
//        String value() default "";
//    }

    //@Repeatable
    //使用@Repeatable这个元注解可以定义Annotation是否可重复。这个注解应用不是特别广泛。
//    @Repeatable
//    @Target(ElementType.TYPE)
//    public @interface Report {
//        int type() default 0;
//        String level() default "info";
//        String value() default "";
//    }

}
